package java_0303_heap;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.Comparator;
import java.util.Queue;//导入系统队列
import java.util.PriorityQueue;//导入系统优先级队列
import java.util.Arrays;
public class PriorityQueueTest1 {
    public static void main(String[] args) {
        //通过构造方法传入比较器
        //默认是最小堆，值（比较器compare的返回值）越小，优先级越高，越先出
        //StudentCom()情况传入值越小返回值越小
        //StudentComDes()情况传入值越小返回值越大
        Queue<Student> queue=new PriorityQueue<>((o1,o2)->o2.getAge()-o1.getAge());
        /**
         * 匿名内部类写法
         */
//        Queue<Student> queue=new PriorityQueue<>(new Comparator<Student>(){
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o2.getAge()-o1.getAge();
//            }
//        });
//        Queue<Student> queue=new PriorityQueue<>(new StudentCom());
        Student stu1=new Student("猪猪侠",6);
        Student stu2=new Student("大大怪",30);
        Student stu3=new Student("开心超人",10);
        //入队
        queue.offer(stu1);
        queue.offer(stu2);
        queue.offer(stu3);
        System.out.println(queue);
        //依次出队：默认是最小堆，年龄越小优先级越高越先出队
        while(!(queue.isEmpty())){
            System.out.println(queue.poll());
        }


//        Student[] students={stu1,stu2,stu3};
//        //sort排序默认是升序排序，而内部compare方法覆写是值大返回值就大，保证最终升序
//        Arrays.sort(students,new StudentCom());
//        System.out.println(Arrays.toString(students));
//        //sort排序默认是升序排序，而内部compare方法覆写是年龄值大返回值就小
//        //返回值小给sort就是往前写，导致年龄值大反而在前面先写，保证了最终降序
//        Arrays.sort(students,new StudentComDesc());
//        System.out.println(Arrays.toString(students));

////        System.out.println(stu1.compareTo(stu2));
////        System.out.println(stu2.compareTo(stu3));
//        //构建一个对象数组
//        Student[] students={stu1,stu2,stu3};
//        Arrays.sort(students);//排序默认是升序排序
//        System.out.println(Arrays.toString(students));
//        System.out.println(stu1.equals(stu2));
//        queue.offer(stu1);
//        queue.offer(stu2);
//        queue.offer(stu3);
//        System.out.println(queue.poll());

        //1.基本类型优先级队列出入队的实现
//        int[] data={1,4,3,2,7,6,5,8,10,9};
//        Queue<Integer> queue=new PriorityQueue();//这里的Queue接口是系统的
//        for(int i:data){//数组依次入队
//            queue.offer(i);
//        }
//        int[] ret=new int[data.length];
//        for (int i = 0; i < ret.length; i++) {
//            //基于最小堆出队就是将当前队列中的最小值依次出队
//            ret[i]=queue.poll();
//        }
//        System.out.println(Arrays.toString(ret));
    }
}
class StudentCom implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        //升序的处理，o1,o2谁大谁在前
        return o1.getAge()-o2.getAge();
    }
}
class StudentComDesc implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        //降序处理结果
        return o2.getAge()-o1.getAge();
    }
}
class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //由于age,name私有，外部类取得需要Getter方法得到
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
/**
 * 内含实现Comparable接口覆写compareTo方法进行比较
 */
//class Student implements Comparable<Student>{
//    String name;
//    int age;
//    public Student(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
//    @Override
//    public String toString() {
//        return "Student{" +
//                "name='" + name + '\'' +
//                ", age=" + age +
//                '}';
//    }
//    @Override
//    public int compareTo(Student o) {
//        return this.age-o.age;
//    }
//}
/**
 *内部含有equals方法比较自定义类型
 */
//class Student{
//    String name;
//    int age;
//    public Student(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
//    public boolean equals(Object o){
//        //将当前对象和传入对象比较
//        if(o==null){
//            return false;
//        }
//        if(this==o){
//            //this是当前对象的引用
//            return true;
//        }
//        //判断是否是student类的对象:判断传入的o是否是Student类new出来的
//        //sout(stu2.equals(stu1))时隐藏向上转型Object object=stu1;
//        if(!(o instanceof Student)){
//            return false;
//        }
//        //此时o一定是Student类的对象而且与当前对象不是一个地址
//        //向下转型还原为Student，比较当前对象的属性和传入对象的属性
//        Student stu=(Student) o;
//        return this.age==stu.age&&this.name.equals(stu.name);
//    }
//    @Override
//    public String toString() {
//        return "Student{" +
//                "name='" + name + '\'' +
//                ", age=" + age +
//                '}';
//    }
//}